package com.kinyx.framework.db.sentence.str;

import java.util.ArrayList;
import java.util.List;

import com.kinyx.framework.db.sentence.defines.Params;
import com.kinyx.framework.db.sentence.defines.Sentence;
import com.kinyx.framework.utils.KArrayUtils;
import com.kinyx.framework.utils.KListUtils;

/**
 * SQL语句对象
 */
public class SQL implements Sentence, Params {

	/** 语句 */
	private StringBuilder sql = new StringBuilder();
	/** 参数 */
	private List<Object> params = new ArrayList<>();

	/**
	 * 追加语句
	 * @param sql 语句
	 * @return 本对象
	 */
	public SQL s(final String sql) {
		this.sql.append(sql);
		return this;
	}

	/**
	 * 追加参数
	 * @param param 参数
	 * @return 本对象
	 */
	public SQL p(final Object param) {
		this.params.add(param);
		return this;
	}

	/**
	 * 追加语句和参数
	 * @param sql 语句
	 * @param param 参数
	 * @param params 参数
	 * @return 本对象
	 */
	public SQL x(final String sql, final Object param, final Object... params) {
		this.s(sql).p(param);
		if (!KArrayUtils.isEmpty(params)) {
			for (final Object p : params) {
				this.p(p);
			}
		}
		return this;
	}

	/**
	 * 追加参数
	 * @param params 参数
	 * @return 本对象
	 */
	public SQL addAll(final List<Object> params) {
		this.params.addAll(params);
		return this;
	}

	/** @return 取语句 */
	@Override
	public String getSentence() { return this.sql.toString(); }

	/** @return 取参数 */
	@Override
	public List<Object> getParams() { return this.params; }

	@Override
	public String toString() { return String.format("SQL: [%s], params: %s", this.getSentence(), KListUtils.toString(this.getParams())); }

}
